﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using testy;

namespace generator
{
    public partial class Generator : Form
    {
        NowyTest nowyTest1; //zadeklarowanie zmiennej pod kontrolkę
        Test nowyT; //zadeklarowanie zmiennej na obiekt typu Test
        Pytanie pytanie; //zadeklarowanie zmiennaj na kontrolkę
        int nr_pytania = 1;
        List<Question> pytania = new List<Question>();
        
        Test editT;
        Pytanie pytanieEdit;

        public Generator()
        {
            InitializeComponent();
        }

        public void restart()
        {
            if(Controls.Contains(pytanie))
                pytanie.Dispose();
            if (Controls.Contains(pytanieEdit))
                pytanieEdit.Dispose();
            if (Controls.Contains(nowyTest1))
                nowyTest1.Dispose();
            this.Controls.Remove(dalej);
            this.Controls.Remove(nextQ);
            this.Controls.Remove(prevQ);
            this.Controls.Remove(label1);
            this.Controls.Remove(zakoncz);
            this.Controls.Remove(anuluj);
            this.Controls.Add(newTest);
            this.Controls.Add(editTest);
            nr_pytania = 1;
            label1.Text = "Pytanie ";
            this.Controls.Remove(info);
            this.Controls.Remove(info2);
            this.Controls.Remove(saveQuestionChange);
            this.Controls.Remove(editSaveTest);
            this.Controls.Remove(EditnextQ);
            this.Controls.Remove(EditprevQ);
            this.Controls.Remove(label2);
            this.Controls.Remove(label3);
            this.Controls.Remove(editName);
            this.Controls.Remove(editLimitczasowy);
            this.Controls.Remove(edycjaNazwy);
            this.Controls.Remove(EdycjaCzasu);
            this.Controls.Remove(dalejEdit);
            this.Controls.Remove(RemoveQuestion);
            this.Controls.Remove(AddQuestion);
        }

        private void newTest_Click(object sender, EventArgs e)
        {
            nowyT = new testy.Test(); //utworzenie obiektu klasy Test 

            this.nowyTest1 = new generator.NowyTest(); //utworzenie kontrolki nowyTest
            this.Controls.Remove(this.newTest);
            this.Controls.Remove(editTest);
            // 
            // nowyTest1
            // 
            this.nowyTest1.Location = new System.Drawing.Point(13, 13);
            this.nowyTest1.Name = "nowyTest1";
            this.nowyTest1.Size = new System.Drawing.Size(400, 300);
            this.nowyTest1.TabIndex = 1;

            this.Controls.Add(nowyTest1); //dodanie kontrolki do formy
            this.Controls.Add(dalej);
            this.Controls.Add(anuluj);
        }

        private void Generator_Load(object sender, EventArgs e)
        {
            //ukrywanie przycisków
            this.Controls.Remove(dalej);
            this.Controls.Remove(nextQ);
            this.Controls.Remove(prevQ);
            this.Controls.Remove(label1);
            this.Controls.Remove(zakoncz);
            this.Controls.Remove(anuluj);
            this.Controls.Remove(info);
            this.Controls.Remove(editName);
            this.Controls.Remove(editLimitczasowy);
            this.Controls.Remove(label2);
            this.Controls.Remove(label3);
            this.Controls.Remove(edycjaNazwy);
            this.Controls.Remove(EdycjaCzasu);
            this.Controls.Remove(dalejEdit);
            this.Controls.Remove(editSaveTest);
            this.Controls.Remove(EditnextQ);
            this.Controls.Remove(EditprevQ);
            this.Controls.Remove(info2);
            this.Controls.Remove(saveQuestionChange);
            this.Controls.Remove(RemoveQuestion);
            this.Controls.Remove(AddQuestion);
        }

        private void dalej_Click(object sender, EventArgs e)
        {
            if (nowyTest1.czy_nazwa == false)
            {
                nowyTest1.ustawPowiadomienie();
            }
            else
            {
                nowyTest1.zdejmijPowiadomienie();
                nowyT.Title = nowyTest1.nazwa_testu;
                nowyT.Time = (uint)nowyTest1.jaki_czas;

                //chowanie kontrolek:
                this.Controls.Remove(dalej);
                this.Controls.Remove(nowyTest1);

                //pokazanie kontrolek:
                if(nr_pytania != nowyTest1.ile_pytan)
                    this.Controls.Add(nextQ);
                if(nr_pytania != 1)
                    this.Controls.Add(prevQ);
                if (nr_pytania == nowyTest1.ile_pytan)
                    this.Controls.Add(zakoncz);
                

                this.pytanie = new generator.Pytanie(); //utworzenie kontrolki pytanie
                // 
                // nowyTest1
                // 
                this.pytanie.Location = new System.Drawing.Point(13, 13);
                this.pytanie.Name = "pytanie";
                this.pytanie.Size = new System.Drawing.Size(740,590);
                this.pytanie.TabIndex = 1;

                this.Controls.Add(pytanie);
                this.Controls.Add(label1);

                label1.Text += (nr_pytania + "/" + nowyTest1.ile_pytan);
            }
        }

        private void nextQ_Click(object sender, EventArgs e)
        {
            if (this.pytanie.czy_wypelnione(this.pytanie.l_odp))
            {
                nr_pytania++;
               
                string[] odpowiedzi = {pytanie.odpo1, pytanie.odpo2, pytanie.odpo3, pytanie.odpo4, pytanie.odpo5, pytanie.odpo6, pytanie.odpo7, pytanie.odpo8, pytanie.odpo9, pytanie.odpo10};
                double[] pkt = { pytanie.pktt1, pytanie.pktt2, pytanie.pktt3, pytanie.pktt4, pytanie.pktt5, pytanie.pktt6, pytanie.pktt7, pytanie.pktt8, pytanie.pktt9, pytanie.pktt10 };
                bool[] poprawnosc = { pytanie.popra1, pytanie.popra2, pytanie.popra3, pytanie.popra4, pytanie.popra5, pytanie.popra6, pytanie.popra7, pytanie.popra8, pytanie.popra9, pytanie.popra10 };

                Answer answer = new Answer();
                Answer[] odp = new Answer[this.pytanie.l_odp];
                for (int i = 0; i < this.pytanie.l_odp; i++)
                {
                    odp[i] = new Answer();
                    odp[i].Content = odpowiedzi[i];
                    odp[i].Pt = pkt[i];
                    odp[i].IsProper = poprawnosc[i];
                }
                List<Answer> answers = new List<Answer>(odp);
                
                bool everyP;
                if(pytanie.properYes)
                    everyP = true;
                else
                    everyP = false;
                
                Question question = new Question(pytanie.trPyt, answers, everyP, (byte)pytanie.l_zaz);
                

                if ((pytania.Count + 1) >= nr_pytania)
                {
                    pytania.ElementAt(nr_pytania - 2).Content = pytanie.trPyt;
                    pytania.ElementAt(nr_pytania - 2).Answers = answers;
                    pytania.ElementAt(nr_pytania - 2).EveryProper = everyP;
                    pytania.ElementAt(nr_pytania - 2).CheckedCount = (byte)pytanie.l_zaz;
                    pytanie.Clear();
                }
                else
                {
                    pytania.Add(question);
                    pytanie.Clear();
                }
                
                
                this.Controls.Add(prevQ);
                label1.Text = "Pytanie " + (nr_pytania + "/" + nowyTest1.ile_pytan);
                this.Controls.Add(info);
                if (nr_pytania == nowyTest1.ile_pytan)
                {
                    this.Controls.Remove(nextQ);
                    this.Controls.Add(zakoncz);
                }
                if (nr_pytania > 1)
                    this.Controls.Add(prevQ);
            }
            else
            {
                //MessageBox.Show("Nie");
            }
        }

        private void prevQ_Click(object sender, EventArgs e)
        {
            nr_pytania--;
            this.Controls.Remove(info);
            this.pytanie.wypelnij(pytania.ElementAt(nr_pytania - 1));
            if (nr_pytania == 1)
                this.Controls.Remove(prevQ);
            label1.Text = "Pytanie " + nr_pytania + "/" + this.nowyTest1.ile_pytan;
            if (nr_pytania < this.nowyTest1.ile_pytan)
            {
                this.Controls.Remove(zakoncz);
                this.Controls.Add(nextQ);
            }
        }

        private void zakoncz_Click(object sender, EventArgs e)
        {
            if (this.pytanie.czy_wypelnione(this.pytanie.l_odp))
            {
                nr_pytania++;
              
                string[] odpowiedzi = {pytanie.odpo1, pytanie.odpo2, pytanie.odpo3, pytanie.odpo4, pytanie.odpo5, pytanie.odpo6, pytanie.odpo7, pytanie.odpo8, pytanie.odpo9, pytanie.odpo10};
                double[] pkt = { pytanie.pktt1, pytanie.pktt2, pytanie.pktt3, pytanie.pktt4, pytanie.pktt5, pytanie.pktt6, pytanie.pktt7, pytanie.pktt8, pytanie.pktt9, pytanie.pktt10 };
                bool[] poprawnosc = { pytanie.popra1, pytanie.popra2, pytanie.popra3, pytanie.popra4, pytanie.popra5, pytanie.popra6, pytanie.popra7, pytanie.popra8, pytanie.popra9, pytanie.popra10 };

                Answer answer = new Answer();
                Answer[] odp = new Answer[this.pytanie.l_odp];
                for (int i = 0; i < this.pytanie.l_odp; i++)
                {
                    odp[i] = new Answer();
                    odp[i].Content = odpowiedzi[i];
                    odp[i].Pt = pkt[i];
                    odp[i].IsProper = poprawnosc[i];
                }
                List<Answer> answers = new List<Answer>(odp);
                
                bool everyP;
                if(pytanie.properYes)
                    everyP = true;
                else
                    everyP = false;
                
                Question question = new Question(pytanie.trPyt, answers, everyP, (byte)pytanie.l_zaz);
             
                                
                pytania.Add(question);

                nowyT.Questions = pytania;

                SaveFileDialog windowSave = new SaveFileDialog();
                windowSave.Filter = "tst files (*.tst)|*.tst|All files (*.*)|*.*";
                windowSave.RestoreDirectory = true;
                windowSave.Title = "Zapisywanie testu";
                //windowSave.CheckFileExists = true;
                //windowSave.CheckPathExists = true;
                windowSave.DefaultExt = "tst";
                if (windowSave.ShowDialog() == DialogResult.OK)
                {
                    string name = windowSave.FileName;
                    File.WriteAllText(name,nowyT.generateXML());
                    this.restart();
                    MessageBox.Show("Test został pomyślnie zapisany.");
                }
            }
            else
            {
                //MessageBox.Show("Nie");
            }
        }

        private void anuluj_Click(object sender, EventArgs e)
        {
            DialogResult dialogResult = MessageBox.Show("Czy chcesz anlulować test?", "Anulowanie", MessageBoxButtons.YesNo);
            if (dialogResult == DialogResult.Yes)
            {
                this.restart();
            }
        }

        private void editTest_Click(object sender, EventArgs e)
        {
            OpenFileDialog openTest = new OpenFileDialog();
            openTest.Filter = "tst files (*.tst)|*.tst|All files (*.*)|*.*";
            openTest.RestoreDirectory = true;
            openTest.Title = "Wczytywanie testu";
            //windowSave.CheckFileExists = true;
            //windowSave.CheckPathExists = true;
            openTest.DefaultExt = "tst";
            if (openTest.ShowDialog() == DialogResult.OK)
            {
                string name = openTest.FileName;
                
                editT = new testy.Test(name); //utworzenie obiektu klasy Test

                this.Controls.Remove(this.newTest);
                this.Controls.Remove(this.editTest);
                this.Controls.Add(label2);
                this.Controls.Add(label3);
                this.Controls.Add(editName);
                this.Controls.Add(editLimitczasowy);
                this.Controls.Add(EdycjaCzasu);
                this.Controls.Add(edycjaNazwy);
                this.Controls.Add(dalejEdit);
                this.Controls.Add(anuluj);

                editName.Text = editT.Title;
                editLimitczasowy.Value = editT.Time;
            }
        }

        private void edycjaNazwy_Click(object sender, EventArgs e)
        {
            editT.Title = editName.Text;
            this.info2.Text = "Zmieniono nazwę testu";
            this.Controls.Add(info2);
        }

        private void EdycjaCzasu_Click(object sender, EventArgs e)
        {
            editT.Time = (uint)editLimitczasowy.Value;
            this.info2.Text = "Zmieniono limit czasowy";
            this.Controls.Add(info2);
        }

        private void dalejEdit_Click(object sender, EventArgs e)
        {
            //chowanie kontrolek:
            this.Controls.Remove(label2);
            this.Controls.Remove(label3);
            this.Controls.Remove(editName);
            this.Controls.Remove(editLimitczasowy);
            this.Controls.Remove(EdycjaCzasu);
            this.Controls.Remove(edycjaNazwy);
            this.Controls.Remove(dalejEdit);
            this.Controls.Remove(info2);

            //pokazanie kontrolek:
            if (nr_pytania != editT.Questions.Count)
                this.Controls.Add(EditnextQ);
            if (nr_pytania != 1)
                this.Controls.Add(EditprevQ);
            this.Controls.Add(editSaveTest);
            this.Controls.Add(RemoveQuestion);
            this.Controls.Add(AddQuestion);

            nr_pytania = 1;
            this.pytanieEdit = new generator.Pytanie(); //utworzenie kontrolki pytanie
            // 
            // nowyTest1
            // 
            this.pytanieEdit.Location = new System.Drawing.Point(13, 13);
            this.pytanieEdit.Name = "pytanieEdit";
            this.pytanieEdit.Size = new System.Drawing.Size(740, 590);
            this.pytanieEdit.TabIndex = 1;

            this.Controls.Add(pytanieEdit);
            this.Controls.Add(label1);
            this.Controls.Add(saveQuestionChange);

            label1.Text += (nr_pytania + "/" + editT.Questions.Count);

            pytanieEdit.trPyt = editT.Questions.ElementAt(0).Content;
            pytanieEdit.l_odp = editT.Questions.ElementAt(0).Answers.Count;
            pytanieEdit.l_zaz = editT.Questions.ElementAt(0).CheckedCount;
            pytanieEdit.properYes = editT.Questions.ElementAt(0).EveryProper;
            pytanieEdit.wypelnij(editT.Questions.ElementAt(0));
        }

        private void EditnextQ_Click(object sender, EventArgs e)
        {
            this.Controls.Remove(info2);
            nr_pytania++;
            label1.Text = "Pytanie " + (nr_pytania + "/" + editT.Questions.Count);
            //pokazanie kontrolek:
            if (nr_pytania != editT.Questions.Count)
                this.Controls.Add(EditnextQ);
            else
                this.Controls.Remove(EditnextQ);
            if (nr_pytania != 1)
                this.Controls.Add(EditprevQ);
            else
                this.Controls.Remove(EditprevQ);

            
            pytanieEdit.trPyt = editT.Questions.ElementAt(nr_pytania - 1).Content;
            pytanieEdit.l_odp = editT.Questions.ElementAt(nr_pytania - 1).Answers.Count;
            pytanieEdit.l_zaz = editT.Questions.ElementAt(nr_pytania - 1).CheckedCount;
            pytanieEdit.properYes = editT.Questions.ElementAt(nr_pytania - 1).EveryProper;
            pytanieEdit.wypelnij(editT.Questions.ElementAt(nr_pytania - 1));
        }

        private void EditprevQ_Click(object sender, EventArgs e)
        {
            this.Controls.Remove(info2);
            nr_pytania--;
            label1.Text = "Pytanie " + (nr_pytania + "/" + editT.Questions.Count);
            //pokazanie kontrolek:
            if (nr_pytania != editT.Questions.Count)
                this.Controls.Add(EditnextQ);
            else
                this.Controls.Remove(EditnextQ);
            if (nr_pytania != 1)
                this.Controls.Add(EditprevQ);
            else
                this.Controls.Remove(EditprevQ);


            pytanieEdit.trPyt = editT.Questions.ElementAt(nr_pytania - 1).Content;
            pytanieEdit.l_odp = editT.Questions.ElementAt(nr_pytania - 1).Answers.Count;
            pytanieEdit.l_zaz = editT.Questions.ElementAt(nr_pytania - 1).CheckedCount;
            pytanieEdit.properYes = editT.Questions.ElementAt(nr_pytania - 1).EveryProper;
            pytanieEdit.wypelnij(editT.Questions.ElementAt(nr_pytania - 1));
        }

        private void saveQuestionChange_Click(object sender, EventArgs e)
        {
            string[] odpowiedzi = { pytanieEdit.odpo1, pytanieEdit.odpo2, pytanieEdit.odpo3, pytanieEdit.odpo4, pytanieEdit.odpo5, pytanieEdit.odpo6, pytanieEdit.odpo7, pytanieEdit.odpo8, pytanieEdit.odpo9, pytanieEdit.odpo10 };
            double[] pkt = { pytanieEdit.pktt1, pytanieEdit.pktt2, pytanieEdit.pktt3, pytanieEdit.pktt4, pytanieEdit.pktt5, pytanieEdit.pktt6, pytanieEdit.pktt7, pytanieEdit.pktt8, pytanieEdit.pktt9, pytanieEdit.pktt10 };
            bool[] poprawnosc = { pytanieEdit.popra1, pytanieEdit.popra2, pytanieEdit.popra3, pytanieEdit.popra4, pytanieEdit.popra5, pytanieEdit.popra6, pytanieEdit.popra7, pytanieEdit.popra8, pytanieEdit.popra9, pytanieEdit.popra10 };
            editT.Questions.ElementAt(nr_pytania - 1).Content = pytanieEdit.trPyt;
            editT.Questions.ElementAt(nr_pytania - 1).CheckedCount = (byte)pytanieEdit.l_zaz;
            editT.Questions.ElementAt(nr_pytania - 1).EveryProper = pytanieEdit.properYes;
            
            for (int i = 0; i <= pytanieEdit.l_odp - 1; i++)
            {
                if (pytanieEdit.l_odp > editT.Questions.ElementAt(nr_pytania - 1).Answers.Count)
                {
                    Answer odpowiedz = new Answer(odpowiedzi[i], pkt[i], poprawnosc[i]);
                    editT.Questions.ElementAt(nr_pytania - 1).Answers.Add(odpowiedz);
                }
                editT.Questions.ElementAt(nr_pytania - 1).Answers.ElementAt(i).Content = odpowiedzi[i];
                editT.Questions.ElementAt(nr_pytania - 1).Answers.ElementAt(i).Pt = pkt[i];
                editT.Questions.ElementAt(nr_pytania - 1).Answers.ElementAt(i).IsProper = poprawnosc[i];
            }

            if (pytanieEdit.l_odp < editT.Questions.ElementAt(nr_pytania - 1).Answers.Count)
            {
                for (int i = editT.Questions.ElementAt(nr_pytania - 1).Answers.Count - 1; i >= pytanieEdit.l_odp; i--)
                {
                    editT.Questions.ElementAt(nr_pytania - 1).Answers.RemoveAt(i);
                }
            }

            info2.Text = "Zapisano zmiany w pytaniu";
            this.Controls.Add(info2);
        }

        private void editSaveTest_Click(object sender, EventArgs e)
        {
            SaveFileDialog windowSave = new SaveFileDialog();
            windowSave.Filter = "tst files (*.tst)|*.tst|All files (*.*)|*.*";
            windowSave.RestoreDirectory = true;
            windowSave.Title = "Zapisywanie testu";
            //windowSave.CheckFileExists = true;
            //windowSave.CheckPathExists = true;
            windowSave.DefaultExt = "tst";
            if (windowSave.ShowDialog() == DialogResult.OK)
            {
                string name = windowSave.FileName;
                File.WriteAllText(name, editT.generateXML());
                this.restart();
                MessageBox.Show("Test został pomyślnie zapisany.");
            }
        }

        private void RemoveQuestion_Click(object sender, EventArgs e)
        {
            if (editT.Questions.Count > 1)
            {
                editT.Questions.Remove(editT.Questions.ElementAt(nr_pytania - 1));

                nr_pytania = 1;
                label1.Text = "Pytanie " + (nr_pytania + "/" + editT.Questions.Count);
                //pokazanie kontrolek:
                if (nr_pytania != editT.Questions.Count)
                    this.Controls.Add(EditnextQ);
                else
                    this.Controls.Remove(EditnextQ);
                if (nr_pytania != 1)
                    this.Controls.Add(EditprevQ);
                else
                    this.Controls.Remove(EditprevQ);


                pytanieEdit.trPyt = editT.Questions.ElementAt(nr_pytania - 1).Content;
                pytanieEdit.l_odp = editT.Questions.ElementAt(nr_pytania - 1).Answers.Count;
                pytanieEdit.l_zaz = editT.Questions.ElementAt(nr_pytania - 1).CheckedCount;
                pytanieEdit.properYes = editT.Questions.ElementAt(nr_pytania - 1).EveryProper;
                pytanieEdit.wypelnij(editT.Questions.ElementAt(nr_pytania - 1));
                info2.Text = "Usunięto pytanie";
            }
            else
            {
                MessageBox.Show("Test musi zawierać przynajmniej jedno pytanie.");
            }
        }

        private void AddQuestion_Click(object sender, EventArgs e)
        {
            string[] odpowiedzi = { pytanieEdit.odpo1, pytanieEdit.odpo2, pytanieEdit.odpo3, pytanieEdit.odpo4, pytanieEdit.odpo5, pytanieEdit.odpo6, pytanieEdit.odpo7, pytanieEdit.odpo8, pytanieEdit.odpo9, pytanieEdit.odpo10 };
            double[] pkt = { pytanieEdit.pktt1, pytanieEdit.pktt2, pytanieEdit.pktt3, pytanieEdit.pktt4, pytanieEdit.pktt5, pytanieEdit.pktt6, pytanieEdit.pktt7, pytanieEdit.pktt8, pytanieEdit.pktt9, pytanieEdit.pktt10 };
            bool[] poprawnosc = { pytanieEdit.popra1, pytanieEdit.popra2, pytanieEdit.popra3, pytanieEdit.popra4, pytanieEdit.popra5, pytanieEdit.popra6, pytanieEdit.popra7, pytanieEdit.popra8, pytanieEdit.popra9, pytanieEdit.popra10 };
            List<Answer> answery = new List<Answer>();
            
            for(int i = 0; i < pytanieEdit.l_odp; i++)
            {
                Answer od = new Answer();
                od.Content = odpowiedzi[i];
                od.Pt = pkt[i];
                od.IsProper = poprawnosc[i];
                answery.Add(od);
            }
            Question question = new Question(pytanieEdit.trPyt, answery ,pytanieEdit.properYes, (byte)pytanieEdit.l_zaz);
            editT.Questions.Add(question);
            info2.Text = "Pytanie zostało dodane do testu.";
            this.Controls.Add(info2);
            
            
            nr_pytania = 1;
            label1.Text = "Pytanie " + (nr_pytania + "/" + editT.Questions.Count);
            //pokazanie kontrolek:
            if (nr_pytania != editT.Questions.Count)
                this.Controls.Add(EditnextQ);
            else
                this.Controls.Remove(EditnextQ);
            if (nr_pytania != 1)
                this.Controls.Add(EditprevQ);
            else
                this.Controls.Remove(EditprevQ);


            pytanieEdit.trPyt = editT.Questions.ElementAt(nr_pytania - 1).Content;
            pytanieEdit.l_odp = editT.Questions.ElementAt(nr_pytania - 1).Answers.Count;
            pytanieEdit.l_zaz = editT.Questions.ElementAt(nr_pytania - 1).CheckedCount;
            pytanieEdit.properYes = editT.Questions.ElementAt(nr_pytania - 1).EveryProper;
            pytanieEdit.wypelnij(editT.Questions.ElementAt(nr_pytania - 1));
        }
    }
}
